home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
fish
/
001-100
/
001-025
/
024
/
conquest
/
conq1.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-17
|
9KB
|
246 lines
#include <stdio.h>
#include "defs.h"
#include "structs.h"
#include "vars.h"
boolean
any_bc(team, starnum)
tteam team;
int starnum;
{
boolean any;
int tf_number;
any = false;
if ( tf_stars[starnum][team]>0 ) {
tf_number = 1;
while ( (! any) && (tf_number < 27) ) {
any = (tf[team][tf_number].dest==starnum) &&
(tf[team][tf_number].eta==0) &&
((tf[team][tf_number].c>0) ||
(tf[team][tf_number].b>0));
tf_number = tf_number +1;
};
};
return (any);
}
best_plan(St9rnum, S9ze, T9am)
int *St9rnum, *S9ze;
tteam *T9am;
{
tplanet *pplanet;
int starnum, size;
tteam team;
team = none;
starnum = *St9rnum;
size = 0;
pplanet = stars[starnum].first_planet;
while ( pplanet != nil ) {
if ( pplanet->capacity > size ) {
size = pplanet->capacity;
team = pplanet->team;
};
pplanet=pplanet->next;
};
*T9am = team;
*St9rnum = starnum;
*S9ze = size;
}
check_game_over()
{
boolean dead[2];
boolean quit_game;
int total[2], transports[2], inhabs[2];
tteam team;
int tfnum, starnum;
struct stplanet *pplan;
quit_game = game_over;
for (team=ENEMY; team <= player; team++) {
transports[team] = 0;
inhabs[team] = 0;
for ( tfnum = 1 ; tfnum<=26; tfnum++ ) {
if ( tf[team][tfnum].dest != 0 )
transports[team] = transports[team]
+ tf[team][tfnum].t;
};
};
for ( starnum = 1 ; starnum<=nstars; starnum++ ) {
pplan = stars[starnum].first_planet;
while ( pplan != nil ) {
switch ( pplan->team ){
case player:
inhabs[player] = inhabs[player] + pplan->iu;
break;
case ENEMY:
inhabs[ENEMY] = inhabs[ENEMY] + pplan->iu;
break;
}; /*switch (*/
pplan = pplan->next;
};
};
for ( team = ENEMY ; team<=player; team++ ) {
total[team] = inhabs[team] + transports[team];
dead[team] = total[team]==0;
};
if ( (! dead[player]) && (! dead[ENEMY]) && (turn >= 40) ) {
dead[ENEMY] = total[player] / total[ENEMY] >= 8;
dead[player] = total[ENEMY] / total[player] >=8;
};
game_over = dead[player] || dead[ENEMY] || (turn>100) ||
quit_game;
if ( game_over ) {
cle2r_screen();
printf("*** Game over ***\n");
printf("Player: Population in transports:%3d",
transports[player]);
printf(" IU's on colonies: %3d TOTAL: %3d\n", inhabs[player],
total[player]);
putchar('\n');
printf("Enemy: Population in transports:%3d",
transports[ENEMY]);
printf(" IU's on colonies: %3d TOTAL: %3d\n",
inhabs[ENEMY], total[ENEMY]);
if ( (total[ENEMY] > total[player]) || quit_game )
printf("**** THE ENEMY HAS CONQUERED THE GALAXY ***\n");
else if ( (total[player] > total[ENEMY]) )
printf("*** PLAYER WINS- YOU HAVE SAVED THE GALAXY! ***\n");
else
printf("*** DRAWN ***\n");
};
}
double fmin();
double exp(), log();
display_forces(ennum, plnum, En0dds, Pl0dds, Battl9)
float *En0dds, *Pl0dds;
boolean *Battl9;
{
float enodds, plodds;
boolean battle;
int en_forces, pl_forces;
zero_tf(ENEMY,ennum);
zero_tf(player,plnum);
battle = true;
if ( tf[ENEMY][ennum].dest != 0 )
en_forces = weapons[ENEMY] * ((tf[ENEMY][ennum].c*c_guns)
+ (tf[ENEMY][ennum].b*b_guns));
else
battle = false;
if ( tf[player][plnum].dest !=0 )
pl_forces= weapons[player]*((tf[player][plnum].c*c_guns)
+ (tf[player][plnum].b*b_guns));
else
battle = false;
point(50,1);
if ( tf[ENEMY][ennum].dest != 0 )
pr5nt_star(tf[ENEMY][ennum].dest);
else if ( tf[player][plnum].dest != 0 )
pr5nt_star(tf[player][plnum].dest);
clear_field();
if ( (en_forces==0) && (pl_forces==0) ) battle=false;
if ( battle ) {
enodds = ((float)pl_forces) / (en_forces
+ tf[ENEMY][ennum].t*t_def
+ tf[ENEMY][ennum].s*s_def);
enodds = fmin( 14.0, enodds);
enodds = exp((log(0.8)) * enodds);
plodds = ((float)en_forces) / (pl_forces
+ tf[player][plnum].t*t_def
+ tf[player][plnum].s*s_def);
plodds = fmin( 14.0, plodds);
plodds = exp( (log(0.8)) * plodds);
point(1,19);
printf("enemy %5d", en_forces);
if ( en_forces > 0 )
printf("(weap %2d)", weapons[ENEMY]);
else
printf(" ");
printf("sur: %4.0f", enodds*100.0);
point(1,20);
printf("player %5d", pl_forces);
if ( pl_forces > 0 )
printf("(weap %2d)", weapons[player]);
else
printf(" ");
printf("sur: %4.0f", plodds*100.0);
};
*En0dds = enodds;
*Pl0dds = plodds;
*Battl9 = battle;
}
disp_tf(taskf)
struct sttf *taskf;
{
if ( taskf->t !=0 ) printf("%2dt", taskf->t);
else printf(" ");
if ( taskf->s !=0 ) printf("%2ds", taskf->s);
else printf(" ");
if ( taskf->c !=0 ) printf("%2dc", taskf->c);
else printf(" ");
if ( taskf->b !=0 ) printf("%2db", taskf->b);
else printf(" ");
}
EN2MY_attack(starnum)
int starnum;
{
int attack_factors,def_factors;
float odds,best_score;
struct stplanet *pplanet,*best_planet;
int en_tf,i;
boolean first[8];
for ( i= 1 ; i<=7; i++ )
first[i] = true;
en_tf = 1;
while ((tf[ENEMY][en_tf].dest!=starnum) ||
(tf[ENEMY][en_tf].eta != 0 ) ) en_tf = en_tf + 1;
do {
attack_factors = tf[ENEMY][en_tf].c + 6
* tf[ENEMY][en_tf].b;
best_planet = nil;
best_score = 1000;
pplanet = stars[starnum].first_planet;
while (pplanet != nil ) {
if ( (pplanet->team == player) ) {
def_factors = pplanet->esee_def;
odds = (float)def_factors / attack_factors;
if ( pplanet->capacity > 30 )
odds = (odds - 2) * pplanet->capacity;
else
odds = (odds - 1.5)* pplanet->capacity;
if ( odds < best_score ) {
best_score = odds;
best_planet = pplanet;
};
};
pplanet = pplanet->next;
};
if ( best_score < 0 ) {
cle3r_left();
point(1,19);
printf("Enemy attacks: %c%d", starnum+'A'-1,
best_planet->number);
point(50,1);
pr5nt_star(starnum);
clear_field();
pause();
fire_salvo(ENEMY,&tf[ENEMY][en_tf],0,best_planet,
first[best_planet->number]);
first[best_planet->number] = false;
zero_tf(ENEMY,en_tf);
best_planet->esee_def = best_planet->mb +
6 * best_planet->amb;
pause();
};
}
while (best_score < 0 && any_bc(ENEMY, starnum));
revolt(starnum);
}